package com.example.mytestdemo.car.appwidget

import android.app.PendingIntent
import android.app.Service
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.os.IBinder
import android.util.Log
import android.widget.RemoteViews
import com.example.mytestdemo.R
import android.app.AlarmManager
import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE
import android.content.ComponentName
import android.os.Build


/**
 * @author tgw
 * @date 2022/11/22
 * @describe
 *
 * 定时刷新
 * https://www.iteye.com/blog/totoxian-2162627
 */
class SimpleWidgetProvide : AppWidgetProvider() {


    companion object {
        private const val TAG = "SimpleWidgetProvide"

    }

    /**该类将BroadcastReceiver扩展为一个方便的类来处理小部件广播。它只接收与小部件相关的事件广
    播，例如当小部件被更新、删除、启用和禁用时。当这些广播事件发生时，将调用以下方法：
    如果在前面的 AppWidgetProviderInfo 中定义了 updatePeriodMillis ，系统会根据这个时间周期性
    的产生 ACTION_APPWIDGET_UPDATE 事件。当用户添加widget时也会产生这一事件。
    此方法在用户添加小部件时也会调用，因此它应执行基本设置，例如为 View 对象定义事件处理程序或
    启动作业以加载要在小部件中显示的数据。但是，如果您声明了一个没有标志的配置活动，则在用户添
    加小部件时不会调用此方法，而是为后续更新调用此方法。配置活动负责在配置完成后执行第一次更
    新。
     */
    override fun onUpdate(
        context: Context, appWidgetManager: AppWidgetManager,
        appWidgetIds: IntArray
    ) {
        for (appWidgetId in appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId)
        }
        Log.e(TAG, "onUpdate: $appWidgetIds")
    }

    /**
     * 在第一次放置小部件或调整小部件的大小时产生这一事件。使用此回调可以根据小部件的大小范围显示
    或隐藏内容或者获取大小范围。
    通过 AppWidgetManager.getAppWidgetOptions(appWidgetId) 可以获取对应WidgetId的Bundle，
    其中包括以下内容：
    OPTION_APPWIDGET_MIN_WIDTH ：包含小部件实例的宽度下限（单位dp）。
    OPTION_APPWIDGET_MIN_HEIGHT ：包含小部件实例高度的下限（单位:dp）。
    OPTION_APPWIDGET_MAX_WIDTH ：包含小部件实例的宽度上限（单位:dp）。
    OPTION_APPWIDGET_MAX_HEIGHT ：包含小部件实例高度的上限（单位:dp）。
     */
    override fun onAppWidgetOptionsChanged(
        context: Context?,
        appWidgetManager: AppWidgetManager?,
        appWidgetId: Int,
        newOptions: Bundle?
    ) {
        super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions)
        Log.d(TAG, "onAppWidgetOptionsChanged: ")
    }

    /**
     * 每次从窗口小部件主机中删除窗口小部件时，都会调用该函数。
     **/
    override fun onDeleted(context: Context?, appWidgetIds: IntArray?) {
        super.onDeleted(context, appWidgetIds)
        Log.d(TAG, "onDeleted: ")
    }

    /**
     *这在第一次创建小部件的实例时调用。
    例如，如果用户添加了两个小部件实例，则这只是第一次调用。如果您需要打开一个新的数据库或执行
    另一个只需要对所有小部件实例执行一次的设置，那么这是一个很好的地方
     */
    override fun onEnabled(context: Context?) {
        super.onEnabled(context)
        Log.d(TAG, "onEnabled: ")
    }

    /**
     * 当创建的小部件的最后一个实例从AppWidgetHost中删除时，将调用此函数。
     * */
    override fun onDisabled(context: Context?) {
        super.onDisabled(context)
        Log.d(TAG, "onDisabled: ")
    }

    /**
     * 当AppWidget提供的实例从备份中恢复使调用。此方法调用后，会立即调用onUpdate。
    当需要从持久化数据中恢复Widget时，需要重写此方法将旧的AppWidgetID重新映射到新值，并更新
    任何其他可能相关的状态。
     * */
    override fun onRestored(context: Context?, oldWidgetIds: IntArray?, newWidgetIds: IntArray?) {
        super.onRestored(context, oldWidgetIds, newWidgetIds)
        Log.d(TAG, "onRestored: ")
    }

    override fun onReceive(context: Context?, intent: Intent?) {
        super.onReceive(context, intent)
        Log.d(TAG, "onReceive: ${ACTION_APPWIDGET_UPDATE}")
        Log.d(TAG, "onReceive: ${intent?.action}")
        val extras = intent!!.extras
        if (extras != null) {
            val oldIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_OLD_IDS)
            val newIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS)
            if (oldIds != null && oldIds.size > 0) {
                onRestored(context, oldIds, newIds)
                onUpdate(context!!, AppWidgetManager.getInstance(context), newIds!!)
            }
        }
    }
}

internal fun updateAppWidget(
    context: Context, appWidgetManager:
    AppWidgetManager, appWidgetId: Int
) {
    val widgetText = "林栩2"
    val views = RemoteViews(context.packageName, R.layout.activity_simple_appwidget)
    views.setTextViewText(R.id.bt_, widgetText)

    var intent = Intent(context, SimpleAppWidgetActivity::class.java)
    intent.putExtra("param", "小部件跳转传参")
    val pending = PendingIntent.getActivity(
        context, 0, intent,
        PendingIntent.FLAG_MUTABLE
    )

    views.setOnClickPendingIntent(R.id.bt_, pending)

// 更新整个widget
    appWidgetManager.updateAppWidget(appWidgetId, views)

    // 更新部分widget
    appWidgetManager.partiallyUpdateAppWidget(appWidgetId, views)

    //定时刷新
    val updateIntent = Intent(context, UpdateService::class.java)
    val pendingIntent: PendingIntent
    pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        PendingIntent.getService(context, 123, updateIntent, PendingIntent.FLAG_IMMUTABLE)
    } else {
        PendingIntent.getService(context, 123, updateIntent, PendingIntent.FLAG_ONE_SHOT)
    }


//使用Alarm定时更新界面数据
    val alarm = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager

    alarm.setRepeating(AlarmManager.RTC,System.currentTimeMillis(), (60 * 1000).toLong(), pendingIntent)
}

internal class UpdateService : Service() {

    var count = 3
    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    override fun onStartCommand(intentService: Intent, flags: Int, startId: Int): Int {
        Log.d("SimpleWidgetProvide", "UpdateService onStartCommand: ")
        var context = this

        val widgetText = "林栩3$count${intentService.getIntExtra("id",0)}"
        val views = RemoteViews(context.packageName, R.layout.activity_simple_appwidget)
        views.setTextViewText(R.id.bt_, widgetText)

        var intent = Intent(context, SimpleAppWidgetActivity::class.java)
        intent.putExtra("param", "小部件跳转传参")
        val pending = PendingIntent.getActivity(
            context, 0, intent,
            PendingIntent.FLAG_MUTABLE
        )

        views.setOnClickPendingIntent(R.id.bt_, pending)

// 更新整个widget
//    appWidgetManager.updateAppWidget(appWidgetId, views)
        val awg = AppWidgetManager.getInstance(context)
        //服务刷新这里必须为之前的SimpleWidgetProvide对象
        awg.updateAppWidget(
            ComponentName(context,SimpleWidgetProvide::class.java),
            views
        )

        return super.onStartCommand(intentService, flags, startId)

    }

    override fun onStart(intent: Intent?, startId: Int) {
        super.onStart(intent, startId)
        Log.d("SimpleWidgetProvide", "onStart: ")
    }


}
